package net.minecraft.block.properties;

import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import com.google.common.collect.Collections2;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import net.minecraft.util.IStringSerializable;

import java.util.Collection;
import java.util.Iterator;
import java.util.Map;

public class PropertyEnum extends PropertyHelper {
    private final ImmutableSet allowedValues;

    /**
     * Map of names to Enum values
     */
    private final Map nameToValue = Maps.newHashMap();
    // private static final String __OBFID = "CL_00002015";

    protected PropertyEnum(String name, Class valueClass, Collection allowedValues) {
        super(name, valueClass);
        this.allowedValues = ImmutableSet.copyOf(allowedValues);
        Iterator var4 = allowedValues.iterator();

        while (var4.hasNext()) {
            Enum var5 = (Enum) var4.next();
            String var6 = ((IStringSerializable) var5).getName();

            if (this.nameToValue.containsKey(var6)) {
                throw new IllegalArgumentException("Multiple values have the same name \'" + var6 + "\'");
            }

            this.nameToValue.put(var6, var5);
        }
    }

    public Collection getAllowedValues() {
        return this.allowedValues;
    }

    public String getName(Enum value) {
        return ((IStringSerializable) value).getName();
    }

    /**
     * Create a new PropertyEnum with all Enum constants of the given class.
     */
    public static PropertyEnum create(String name, Class clazz) {
        return create(name, clazz, Predicates.alwaysTrue());
    }

    /**
     * Create a new PropertyEnum with all Enum constants of the given class that match the given Predicate.
     */
    public static PropertyEnum create(String name, Class clazz, Predicate filter) {
        return create(name, clazz, Collections2.filter(Lists.newArrayList(clazz.getEnumConstants()), filter));
    }

    /**
     * Create a new PropertyEnum with the specified values
     */
    public static PropertyEnum create(String name, Class clazz, Enum... values) {
        return create(name, clazz, Lists.newArrayList(values));
    }

    /**
     * Create a new PropertyEnum with the specified values
     */
    public static PropertyEnum create(String name, Class clazz, Collection values) {
        return new PropertyEnum(name, clazz, values);
    }

    /**
     * Get the name for the given value.
     */
    public String getName(Comparable value) {
        return this.getName((Enum) value);
    }
}
